package edu.ncu.utils;

import edu.ncu.entity.Contact;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * 聊天消息工具类
 */
@Component
public class ChatMessageUtils {
    @Autowired
    private RedisUtil redisUtil ;

    private String getChatMessageKey(int usedId) {
        return "chat_message:"+usedId ;
    }
    private String getChatMessageKey() {
        return "chat_message" ;
    }

    /** userId作为离线消息的接收者和发送者
     * 根据usedId获取离线消息
     * @param usedId
     */
    public List<Contact> getChatMessageList(int usedId) {
        //String key = getChatMessageKey() ;
        List<Contact> res = new ArrayList<>() ;
        List<Contact> list =  redisUtil.lGetAll(getChatMessageKey());
        list.forEach((e) -> {
            if (e.getReceiverId() == usedId || e.getSenderId()==usedId)
                res.add(e) ;
        });
        return res ;
    }

    // 将所有离线消息改为在线消息(删除过长的离线消息)
    public void changeMessage(int userId) {
        String key = getChatMessageKey(userId) ;
        long size = redisUtil.lSize(key) ;
        //redisTemplate.opsForList().leftPop(key,size-10,10)
        for (int i=0;i<size-10;i++) {
            //
            redisUtil.leftPop(key) ;
        }
    }

    /**
     * right_push
     * 在线消息和离线消息，如果右边已经有在线消息了，那把所有的离线消息都改为在线消息
     * 添加离线消息
     * @param contact
     */
    public void addChatMessage(Contact contact) {
        String key = getChatMessageKey() ;
        redisUtil.rightPush(key,contact) ;
//        int userId = contact.getReceiverId() ;
//        String key = getChatMessageKey(userId) ;
//        // 检查消息大小，如果超过指定大小则不会再接受消息
//
//        redisUtil.rightPush(key,contact) ;
        if (contact.getType() == 0) {
            // 表示是离线消息
        } else {
            // 如果添加的是在线消息，则需要判断消息是否过大，过大再删除
            if (redisUtil.lSize(key) > 50) {
                // 删除消息 , 注意不能删除离线消息
                redisUtil.leftPop(key) ;
            }
        }
    }

    /**
     * 删除所有离线消息
     * @param usedId
     */
    public void removeAllChatMessage(int usedId) {
        String key = getChatMessageKey(usedId) ;
        redisUtil.lRemoveAll(key) ;
    }

}
